package bean;

import java.sql.SQLException;
import java.util.Date;

import Utils.Uteis;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

import org.richfaces.component.UISelect;

import DAO.ExameDAO;
import DAO.PacienteDAO;
import Model.Exame;
import Model.Paciente;
import Model.Usuario;


public class ExameBean {
	private int id;
	private String descricao;
	private String resultado;
	private Date dataExame;
	private int idPaciente;
	private int idUsuario;
	private int idLaboratorio;
	private int idTipoExame;	
	
	private UISelect idPacienteValidation;

	public ExameBean() {
		// TODO Auto-generated constructor stub
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getResultado() {
		return resultado;
	}

	public void setResultado(String resultado) {
		this.resultado = resultado;
	}

	public Date getDataExame() {
		return dataExame;
	}

	public void setDataExame(Date dataExame) {
		this.dataExame = dataExame;
	}

	public int getIdPaciente() {
		return idPaciente;
	}

	public void setIdPaciente(int idPaciente) {
		this.idPaciente = idPaciente;
	}

	public int getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}

	public int getIdLaboratorio() {
		return idLaboratorio;
	}

	public void setIdLaboratorio(int idLaboratorio) {
		this.idLaboratorio = idLaboratorio;
	}

	public int getIdTipoExame() {
		return idTipoExame;
	}

	public void setIdTipoExame(int idTipoExame) {
		this.idTipoExame = idTipoExame;
	}
	
	public UISelect getIdPacienteValidation() {
		return idPacienteValidation;
	}

	public void setIdPacienteValidation(UISelect idPacienteValidation) {
		this.idPacienteValidation = idPacienteValidation;
	}
	
	public String Salvar()
	{
		Exame exame = new Exame();		
		try
		{			
		    Usuario objUsuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("currentUser");		
			exame.setDescricao(this.descricao);
			exame.setResultado(this.resultado != null ? this.resultado : null);
			exame.setIdPaciente(this.idPaciente);
			exame.setIdUsuario(objUsuario.getIdUsuario());
			exame.setIdLaboratorio(this.idLaboratorio);
			exame.setDataExame(Uteis.javaDate2SqlDate(this.dataExame));
			exame.setIdTipoExame(this.idTipoExame);
			
			if(this.id > 0)
			{
				exame.setIdExame(this.id);
				ExameDAO.Update(exame);
			}
			else
				ExameDAO.Insert(exame);
			
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Salvas com sucesso"));
			
		}		
		catch(Exception ex)
		{
			ex.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}		
		
		return "exame_list";
	}
	
	public String Editar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		int id =  Integer.parseInt(request.getParameter("idexame"));
		Exame exame = null;
		
		try
		{
			exame = ExameDAO.LoadObjet(id);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		if(exame != null)
		{
			this.setId(exame.getIdExame());
			this.setDescricao(exame.getDescricao());
			this.setResultado(exame.getResultado());
			this.setDataExame(exame.getDataExame());
			this.setIdPaciente(exame.getIdPaciente());
			this.setIdUsuario(exame.getIdUsuario());
			this.setIdLaboratorio(exame.getIdLaboratorio());
			this.setIdTipoExame(exame.getIdTipoExame());
			
			return "exame_edit";
		}
		else
		{
			return "exame_list";
		}
	}
	
	public String InativarExame()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		int id =  Integer.parseInt(request.getParameter("idexame"));
		
		try
		{
			ExameDAO.InativarExame(id);
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações apagadas com sucesso"));
		}
		catch(SQLException ex)
		{
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao realizar a transação, contate o administrador do sistema"));	
		}		
		return "exame_list";
	}
	
	public void validateData(FacesContext context, UIComponent uicomponent, Object value)
	{
		Date dataSel = (Date) value;

		try {
			if(dataSel.after(new Date()))
			{
				((UIInput)uicomponent).setValid(false);
				FacesMessage message = new FacesMessage();
				message.setDetail("A data não pode estar no futuro!");        	
				message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
				throw new ValidatorException(message);
			}	
			else
			{	
				Object idPacienteSelect = this.idPacienteValidation.getLocalValue();	
				if(idPacienteSelect != null)
				{
					int idPaciente = Integer.parseInt(this.idPacienteValidation.getLocalValue().toString());
					Paciente paciente = PacienteDAO.LoadObject(idPaciente);
					if(dataSel.before(paciente.getDataNascimento()))
					{
						String data = Uteis.formatarData(paciente.getDataNascimento());
						((UIInput)uicomponent).setValid(false);
						FacesMessage message = new FacesMessage();					
						message.setDetail("A data não pode ser menor que "+ data +" que é data de nascimento do paciente! ");
						message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
						throw new ValidatorException(message);
					}						
				}
				else
				{
					((UIInput)uicomponent).setValid(false);
				}
			}	
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}
